package top.itaso.app.room.dao;

import androidx.lifecycle.LiveData;
import androidx.room.Dao;
import androidx.room.Delete;
import androidx.room.Insert;
import androidx.room.OnConflictStrategy;
import androidx.room.Query;
import androidx.room.Update;

import org.jetbrains.annotations.NotNull;

import java.util.List;

import top.itaso.app.room.entity.UserEntity;

/**
 * @Description:
 * @Author: dengfu.su
 * @CreateDate: 2022/1/10
 */
@Dao
public interface UserDao {
    /**
     * 查询所有用户
     *
     * @return 所有用户信息
     */
    @Query("SELECT * FROM users")
    LiveData<List<UserEntity>> querys();

    /**
     * 精准匹配一个用户的密码
     *
     * @param username 用户
     * @param password 密码
     * @return 匹配到的单一用户
     */
    @Query("SELECT * FROM users WHERE _username = :username AND _password = :password ")
    UserEntity queryUser(String username, String password);

    /**
     * 查询指定 username（username 为主键，存在，则数据只会有一条，故无需 LIMIT 限制）
     *
     * @param username 匹配的用户
     * @return 匹配到的单一用户
     */
    @Query("SELECT * FROM users WHERE _username = :username")
    UserEntity queryUserName(String username);

    /**
     * 模糊匹配用户名称：displayName
     *
     * @param displayName 模糊匹配的用户
     * @return 匹配到的用户集合
     */
//    @Query("SELECT * FROM users WHERE _display_name LIKE  '%' || :displayName || '%' LIMIT 3")
    @Query("SELECT * FROM users WHERE _display_name LIKE  '%' || :displayName || '%'")
    List<UserEntity> querysLikeDisplayName(String displayName);

    /**
     * 查询指定范围的用户
     *
     * @param usernames 范围用户
     * @return 匹配到的用户集合
     */
    @Query("SELECT * FROM users WHERE _username IN (:usernames)")
    List<UserEntity> querysInUserNames(String[] usernames);

    //---------------------------------------------------------------------------------

    /**
     * 新增用户，OnConflictStrategy.REPLACE：如果有数据冲突（唯一约束值相同），则进行替换为新记录
     *
     * @param user 新增用户
     * @return 数据插入行的ID
     */
    @Insert(onConflict = OnConflictStrategy.REPLACE)
    long insert(UserEntity user);

    /**
     * OnConflictStrategy.REPLACE：如果有数据冲突（唯一约束值相同），则进行替换，其中只增加部分则以新增值为准
     *
     * @param users 新增的用户集
     * @return 数据插入行的ID列表
     */
    @Insert(onConflict = OnConflictStrategy.REPLACE)
    long[] inserts(UserEntity... users);

    /**
     * OnConflictStrategy.REPLACE：如果有数据冲突（唯一约束值相同），则进行替换，其中只增加部分则以新增值为准
     *
     * @param users 新增的用户集
     * @return 数据插入行的ID列表
     */
    @Insert(onConflict = OnConflictStrategy.REPLACE)
    long[] inserts(List<UserEntity> users);

    //---------------------------------------------------------------------------------

    @Delete
    int delete(UserEntity user);

    @Delete
    void delete(List<UserEntity> users);

    //---------------------------------------------------------------------------------

    @Update
    int update(UserEntity user);

    @Update
    void update(List<UserEntity> users);

    /**
     * 修改昵称
     *
     * @param username
     * @param displayName
     */
    @Query("UPDATE users SET _display_name = :displayName WHERE _username = :username")
    int updateDisplayName(String username, String displayName);

    /**
     * 修改用户状态
     *
     * @param username
     * @param state
     */
    @Query("UPDATE users SET _state = :state WHERE _username = :username")
    int updateState(String username, int state);
}

//https://blog.csdn.net/unreliable_narrator/article/details/124959125
//// 您也可以在单独的文件中定义此类
//data class UserBook(val userName: String?, val bookName: String?)
//
//@Dao
//interface UserBookDao {
//    @Query(
//            "SELECT user.name AS userName, book.name AS bookName " +
//                    "FROM user, book " +
//                    "WHERE user.id = book.user_id"
//    )
//    fun loadUserAndBookNames(): LiveData<List<UserBook>>
//}
